package com.ruoyi.file.utils;

import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.file.domain.SysStorageConfig;

import java.util.Arrays;
import java.util.List;

/**
 * 文件验证工具类
 * 统一处理文件类型验证、大小验证等逻辑
 *
 * @author ruoyi
 */
public class FileValidationUtils {

    /**
     * 验证文件类型是否被允许
     *
     * @param fileName           文件名
     * @param allowedFileTypes   允许的文件类型（逗号分隔）
     * @return true表示允许，false表示不允许
     */
    public static boolean isFileTypeAllowed(String fileName, String allowedFileTypes) {
        return FileTypeUtils.isFileTypeAllowed(fileName, allowedFileTypes);
    }

    /**
     * 验证文件大小是否在允许范围内
     *
     * @param fileSize    文件大小（字节）
     * @param maxSize     最大允许大小（字节）
     * @return true表示允许，false表示超出限制
     */
    public static boolean isFileSizeAllowed(long fileSize, long maxSize) {
        if (maxSize <= 0) {
            return true; // 如果没有大小限制，则允许
        }
        return fileSize <= maxSize;
    }

    /**
     * 验证存储配置是否有效
     *
     * @param config 存储配置
     * @return true表示有效，false表示无效
     */
    public static boolean isStorageConfigValid(SysStorageConfig config) {
        return config != null && config.getStatus() != null && config.getStatus() == 1;
    }

    /**
     * 验证存储配置是否完整
     *
     * @param config 存储配置
     * @return true表示完整，false表示缺少必要参数
     */
    public static boolean isStorageConfigComplete(SysStorageConfig config) {
        if (config == null) {
            return false;
        }

        // 检查基本字段
        if (StringUtils.isBlank(config.getStorageType())) {
            return false;
        }

        // 根据存储类型检查特定字段
        switch (config.getStorageType().toLowerCase()) {
            case "local":
                // 本地存储只需要基本信息
                return true;
            case "minio":
            case "aws":
            case "aliyun":
            case "tencent":
                // 云存储需要更多配置
                return StringUtils.isNotBlank(config.getEndpoint()) &&
                       StringUtils.isNotBlank(config.getAccessKey()) &&
                       StringUtils.isNotBlank(config.getSecretKey()) &&
                       StringUtils.isNotBlank(config.getBucketName());
            default:
                return false;
        }
    }

    /**
     * 获取文件类型验证错误信息
     *
     * @param fileName           文件名
     * @param allowedFileTypes   允许的文件类型
     * @return 错误信息，如果验证通过则返回null
     */
    public static String getFileTypeValidationError(String fileName, String allowedFileTypes) {
        if (!isFileTypeAllowed(fileName, allowedFileTypes)) {
            return String.format("不支持的文件类型。允许的类型：%s", allowedFileTypes);
        }
        return null;
    }

    /**
     * 获取文件大小验证错误信息
     *
     * @param fileSize 文件大小（字节）
     * @param maxSize  最大允许大小（字节）
     * @return 错误信息，如果验证通过则返回null
     */
    public static String getFileSizeValidationError(long fileSize, long maxSize) {
        if (!isFileSizeAllowed(fileSize, maxSize)) {
            return String.format("文件大小超出限制。最大允许：%d字节，当前：%d字节", maxSize, fileSize);
        }
        return null;
    }

    /**
     * 格式化文件大小为人类可读的格式
     *
     * @param bytes 字节数
     * @return 格式化后的大小字符串
     */
    public static String formatFileSize(long bytes) {
        if (bytes < 1024) {
            return bytes + " B";
        } else if (bytes < 1024 * 1024) {
            return String.format("%.1f KB", bytes / 1024.0);
        } else if (bytes < 1024 * 1024 * 1024) {
            return String.format("%.1f MB", bytes / (1024.0 * 1024));
        } else {
            return String.format("%.1f GB", bytes / (1024.0 * 1024 * 1024));
        }
    }
}
